package caj.springboot.utils;

import cn.hutool.core.date.DateTime;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.google.common.collect.Lists;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * @description: 时间转换工具类
 * @author: CAJ
 * @time: 2024/12/28 12:11
 */
public class DateUtils {
 
    /**
     * y:年份
     * M:月份
     * d:日期
     * H:小时（24小时制）
     * h:小时（12小时制）
     * m:分钟
     * s:秒钟
     * S:毫秒
     */
 
    public final static String DATE_YYYY_PATTERN = "yyyy";
    public final static String DATE_YYYY_PATTERN2 = "yyyy年";
    public final static String DATE_MM_PATTERN = "MM";
    public final static String DATE_MM_PATTERN2 = "MM月";
    public final static String DATE_DD_PATTERN = "dd";
    public final static String DATE_DD_PATTERN2 = "dd日";
 
    public final static String TIME_HH_PATTERN = "HH";
    public final static String TIME_HH_PATTERN2 = "HH小时";
    public final static String TIME_hh_PATTERN = "hh小时";
    public final static String TIME_hh_PATTERN2 = "hh小时";
    public final static String TIME_MM_PATTERN = "mm";
    public final static String TIME_MM_PATTERN2 = "mm分钟";
    public final static String TIME_SS_PATTERN = "ss";
    public final static String TIME_SS_PATTERN2 = "ss秒";
 
    public final static String DATE_YYYY_MM_PATTERN = "yyyy-MM";
    public final static String DATE_YYYY_MM_PATTERN2 = "yyyy/MM";
    public final static String DATE_YYYY_MM_PATTERN3 = "yyyyMM";
    public final static String DATE_YYYY_MM_PATTERN4 = "yyyy.MM";
    public final static String DATE_YYYY_MM_PATTERN5 = "yyyy年MM月";
    public final static String DATE_MM_DD_PATTERN = "MM-dd";
    public final static String DATE_MM_DD_PATTERN2 = "MM/dd";
    public final static String DATE_MM_DD_PATTERN3 = "MMdd";
    public final static String DATE_MM_DD_PATTERN4 = "MM.dd";
    public final static String DATE_MM_DD_PATTERN5 = "MM月dd日";
 
    public final static String TIME_HH_MM_PATTERN = "HH:mm";
    public final static String TIME_hh_MM_PATTERN = "hh:mm";
    public final static String TIME_MM_SS_PATTERN = "mm:ss";
    public final static String TIME_HH_MM_SS_PATTERN = "HH:mm:ss";
    public final static String TIME_hh_MM_SS_PATTERN = "hh:mm:ss";
 
    public final static String DATE_PATTERN = "yyyy-MM-dd";
    public final static String DATE_PATTERN2 = "yyyy/MM/dd";
    public final static String DATE_PATTERN3 = "yyyyMMdd";
    public final static String DATE_PATTERN4 = "yyyy.MM.dd";
    public final static String DATE_PATTERN5 = "yyyy年MM月dd日";
 
    public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
    public final static String DATE_TIME_PATTERN2 = "yyyyMMddHHmmss";
    public final static String DATE_TIME_PATTERN3 = "yyyy/MM/dd HH:mm:ss";
    public final static String DATE_TIME_PATTERN4 = "yyyy.MM.dd HH:mm:ss";
    public final static String DATE_TIME_PATTERN5 = "yyyy年MM月dd日 HH:mm:ss";
    public final static String DATE_TIME_PATTERN6 = "yyyy年MM月dd日 HH时mm分ss秒";
    public final static String DATE_TIME_PATTERN7 = "yyyy年MM月dd日 HH小时mm分钟ss秒";
    public final static String DATE_TIME_PATTERN8 = "yyyy年MM月dd日HH小时mm分钟ss秒";
 
    public final static String DATE_TIME_h_PATTERN = "yyyy-MM-dd hh:mm:ss";
    public final static String DATE_TIME_h_PATTERN2 = "yyyyMMddhhmmss";
    public final static String DATE_TIME_h_PATTERN3 = "yyyy/MM/dd hh:mm:ss";
    public final static String DATE_TIME_h_PATTERN4 = "yyyy.MM.dd hh:mm:ss";
    public final static String DATE_TIME_h_PATTERN5 = "yyyy年MM月dd日 hh:mm:ss";
    public final static String DATE_TIME_h_PATTERN6 = "yyyy年MM月dd日 hh时mm分ss秒";
    public final static String DATE_TIME_h_PATTERN7 = "yyyy年MM月dd日 hh小时mm分钟ss秒";
    public final static String DATE_TIME_h_PATTERN8 = "yyyy年MM月dd日hh小时mm分钟ss秒";
 
    public final static String DATE_TIME_SSS_PATTERN = "yyyy-MM-dd HH:mm:ss.SSS";
    public final static String DATE_TIME_SSS_PATTERN2 = "yyyyMMddHHmmssSSS";
    public final static String DATE_TIME_SSS_PATTERN3 = "yyyy/MM/dd HH:mm:ss.SSS";
    public final static String DATE_TIME_SSS_PATTERN4 = "yyyy.MM.dd HH:mm:ss.SSS";
    public final static String DATE_TIME_SSS_PATTERN5 = "yyyy年MM月dd日 HH:mm:ss.SSS";
 
    public final static String DATE_TIME_h_SSS_PATTERN = "yyyy-MM-dd hh:mm:ss.SSS";
    public final static String DATE_TIME_h_SSS_PATTERN2 = "yyyyMMddhhmmssSSS";
    public final static String DATE_TIME_h_SSS_PATTERN3 = "yyyy/MM/dd hh:mm:ss.SSS";
    public final static String DATE_TIME_h_SSS_PATTERN4 = "yyyy.MM.dd hh:mm:ss.SSS";
    public final static String DATE_TIME_h_SSS_PATTERN5 = "yyyy年MM月dd日 hh:mm:ss.SSS";
 
    public static String[] WEEK_ARRAY = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
    public static String[] WEEK_ARRAY_CN = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"};
    public static String[] WEEK_ARRAY_CN_TOW = {"", "周一", "周二", "周三", "周四", "周五", "周六", "周日"};
 
    
 
    // ===========================****************Date转String方法****************===========================
 
    /**
     * Date转 格式：DATE_YYYY_PATTERN = "yyyy";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateYYYY(Date date) {
        return format(date, DATE_YYYY_PATTERN);
    }
 
    /**
     * Date转 格式：DATE_YYYY_PATTERN2 = "yyyy年";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateYYYY2(Date date) {
        return format(date, DATE_YYYY_PATTERN2);
    }
 
    /**
     * Date转 格式：DATE_MM_PATTERN = "MM";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateMM(Date date) {
        return format(date, DATE_MM_PATTERN);
    }
 
    /**
     * Date转 格式：DATE_MM_PATTERN2 = "MM月";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateMM2(Date date) {
        return format(date, DATE_MM_PATTERN2);
    }
 
    /**
     * Date转 格式：DATE_DD_PATTERN = "dd";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateDD(Date date) {
        return format(date, DATE_DD_PATTERN);
    }
 
    /**
     * Date转 格式：DATE_DD_PATTERN2 = "dd日";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateDD2(Date date) {
        return format(date, DATE_DD_PATTERN2);
    }
 
    /**
     * Date转 格式：DATE_YYYY_MM_PATTERN = "yyyy-MM";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateYYYYMM(Date date) {
        return format(date, DATE_YYYY_MM_PATTERN);
    }
 
    /**
     * Date转 格式：DATE_YYYY_MM_PATTERN2 = "yyyy/MM";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateYYYYMM2(Date date) {
        return format(date, DATE_YYYY_MM_PATTERN2);
    }
 
    /**
     * Date转 格式：DATE_YYYY_MM_PATTERN3 = "yyyyMM";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateYYYYMM3(Date date) {
        return format(date, DATE_YYYY_MM_PATTERN3);
    }
 
    /**
     * Date转 格式：DATE_YYYY_MM_PATTERN4 = "yyyy.MM";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateYYYYMM4(Date date) {
        return format(date, DATE_YYYY_MM_PATTERN4);
    }
 
    /**
     * Date转 格式： DATE_YYYY_MM_PATTERN5 = "yyyy年MM";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateYYYYMM5(Date date) {
        return format(date, DATE_YYYY_MM_PATTERN5);
    }
 
    /**
     * Date转 格式： DATE_MM_DD_PATTERN = "MM-dd";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateMMDD(Date date) {
        return format(date, DATE_MM_DD_PATTERN);
    }
 
    /**
     * Date转 格式： DATE_MM_DD_PATTERN2 = "MM/dd";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateMMDD2(Date date) {
        return format(date, DATE_MM_DD_PATTERN2);
    }
 
    /**
     * Date转 格式： DATE_MM_DD_PATTERN3 = "MMdd";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateMMDD3(Date date) {
        return format(date, DATE_MM_DD_PATTERN3);
    }
 
    /**
     * Date转 格式： DATE_MM_DD_PATTERN4 = "MM.dd";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateMMDD4(Date date) {
        return format(date, DATE_MM_DD_PATTERN4);
    }
 
    /**
     * Date转 格式： DATE_MM_DD_PATTERN5 = "MM年dd";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateMMDD5(Date date) {
        return format(date, DATE_MM_DD_PATTERN5);
    }
 
    /**
     * Date转 格式： DATE_PATTERN = "yyyy-MM-dd";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDate(Date date) {
        return format(date, DATE_PATTERN);
    }
 
    /**
     * Date转 格式： DATE_PATTERN2 = "yyyy/MM/dd";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDate2(Date date) {
        return format(date, DATE_PATTERN2);
    }
 
    /**
     * Date转 格式： DATE_PATTERN3 = "yyyyMMdd";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDate3(Date date) {
        return format(date, DATE_PATTERN3);
    }
 
    /**
     * Date转 格式： DATE_PATTERN4 = "yyyy.MM.dd";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDate4(Date date) {
        return format(date, DATE_PATTERN4);
    }
 
    /**
     * Date转 格式： DATE_PATTERN5 = "yyyy年MM月dd日";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDate5(Date date) {
        return format(date, DATE_PATTERN5);
    }
 
    // ===========================****************String类型日期转Date方法****************===========================
 
    /**
     * String类型日期转Date方法
     *
     * @param date 日期
     * @return Date日期对象
     */
    public static Date parseDate(String date) {
        return parseDate(date, DATE_PATTERN);
    }
 
    /**
     * String类型日期转Date方法
     *
     * @param date    日期
     * @param pattern 规则
     * @return Date日期对象
     */
    public static Date parseDate(String date, String pattern) {
        if (StringUtils.isBlank(date)) {
            return null;
        }
        if (StringUtils.isBlank(pattern)) {
            pattern = DATE_PATTERN;
        }
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        try {
            return sdf.parse(date);
        } catch (ParseException e) {
            return null;
        }
    }
 
    // ===========================****************DateTime转String方法****************===========================
 
    /**
     * Date转 格式： TIME_HH_PATTERN = "HH";
     *
     * @param date 日期 (24小时制)
     * @return 格式化后的日期字符串
     */
    public static String formatTimeHH(Date date) {
        return format(date, TIME_HH_PATTERN);
    }
 
    /**
     * Date转 格式： TIME_hh_PATTERN = "hh";
     *
     * @param date 日期 (12小时制)
     * @return 格式化后的日期字符串
     */
    public static String formatTimeHh(Date date) {
        return format(date, TIME_hh_PATTERN);
    }
 
    /**
     * Date转 格式：TIME_HH_PATTERN2 = "HH小时";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatTimeHH2(Date date) {
        return format(date, TIME_HH_PATTERN2);
    }
 
    /**
     * Date转 格式： TIME_hh_PATTERN2 = "hh小时";
     *
     * @param date 日期 (12小时制)
     * @return 格式化后的日期字符串
     */
    public static String formatTimeHh2(Date date) {
        return format(date, TIME_hh_PATTERN2);
    }
 
    /**
     * Date转 格式：TIME_MM_PATTERN = "mm";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatTimeMM(Date date) {
        return format(date, TIME_MM_PATTERN);
    }
 
    /**
     * Date转 格式：TIME_MM_PATTERN2 = "mm分钟";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatTimeMM2(Date date) {
        return format(date, TIME_MM_PATTERN2);
    }
 
    /**
     * Date转 格式：TIME_SS_PATTERN = "ss";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatTimeSS(Date date) {
        return format(date, TIME_SS_PATTERN);
    }
 
    /**
     * Date转 格式：TIME_SS_PATTERN2 = "ss秒";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatTimeSS2(Date date) {
        return format(date, TIME_SS_PATTERN2);
    }
 
    /**
     * Date转 格式：TIME_HH_MM_PATTERN = "HH:mm";
     *
     * @param date 日期 (24小时制)
     * @return 格式化后的日期字符串
     */
    public static String formatTimeHHMM(Date date) {
        return format(date, TIME_HH_MM_PATTERN);
    }
 
    /**
     * Date转 格式：TIME_hh_MM_PATTERN = "hh:mm";
     *
     * @param date 日期 (12小时制)
     * @return 格式化后的日期字符串
     */
    public static String formatTimeHhMM(Date date) {
        return format(date, TIME_hh_MM_PATTERN);
    }
 
    /**
     * Date转 格式：TIME_MM_SS_PATTERN = "mm:ss";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatTimeMMSS(Date date) {
        return format(date, TIME_MM_SS_PATTERN);
    }
 
    /**
     * Date转 格式：TIME_HH_MM_SS_PATTERN = "HH:mm:ss";
     *
     * @param date 日期 (24小时制)
     * @return 格式化后的日期字符串
     */
    public static String formatTimeHHMMSS(Date date) {
        return format(date, TIME_HH_MM_SS_PATTERN);
    }
 
    /**
     * Date转 格式：TIME_hh_MM_SS_PATTERN = "hh:mm:ss";
     *
     * @param date 日期 (12小时制)
     * @return 格式化后的日期字符串
     */
    public static String formatTimeHhMMSS(Date date) {
        return format(date, TIME_hh_MM_SS_PATTERN);
    }
 
    /**
     * Date转 格式：DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateTime(Date date) {
        return format(date, DATE_TIME_PATTERN);
    }
 
    /**
     * Date转 格式：DATE_TIME_PATTERN2 = "yyyyMMddHHmmss";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateTime2(Date date) {
        return format(date, DATE_TIME_PATTERN2);
    }
 
    /**
     * Date转 格式：DATE_TIME_PATTERN3 = "yyyy/MM/dd HH:mm:ss";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateTime3(Date date) {
        return format(date, DATE_TIME_PATTERN3);
    }
 
    /**
     * Date转 格式：DATE_TIME_PATTERN4 = "yyyy.MM.dd HH:mm:ss";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateTime4(Date date) {
        return format(date, DATE_TIME_PATTERN4);
    }
 
    /**
     * Date转 格式：DATE_TIME_PATTERN5 = "yyyy年MM月dd日 HH:mm:ss";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateTime5(Date date) {
        return format(date, DATE_TIME_PATTERN5);
    }
 
    /**
     * Date转 格式：DATE_TIME_PATTERN6 = "yyyy年MM月dd日 HH时mm分ss秒";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateTime6(Date date) {
        return format(date, DATE_TIME_PATTERN6);
    }
 
    /**
     * Date转 格式：DATE_TIME_PATTERN7 = "yyyy年MM月dd日 HH小时mm分钟ss秒";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateTime7(Date date) {
        return format(date, DATE_TIME_PATTERN7);
    }
 
    /**
     * Date转 格式：DATE_TIME_PATTERN8 = "yyyy年MM月dd日HH小时mm分钟ss秒";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateTime8(Date date) {
        return format(date, DATE_TIME_PATTERN8);
    }
 
    /**
     * Date转 格式：DATE_TIME_h_PATTERN = "yyyy-MM-dd hh:mm:ss";
     *
     * @param date 日期 (12小时制)
     * @return 格式化后的日期字符串
     */
    public static String formatDateTimeH(Date date) {
        return format(date, DATE_TIME_h_PATTERN);
    }
 
    /**
     * Date转 格式：DATE_TIME_h_PATTERN2 = "yyyyMMddhhmmss";
     *
     * @param date 日期 (12小时制)
     * @return 格式化后的日期字符串
     */
    public static String formatDateTimeH2(Date date) {
        return format(date, DATE_TIME_h_PATTERN2);
    }
 
    /**
     * Date转 格式：DATE_TIME_h_PATTERN3 = "yyyy/MM/dd hh:mm:ss";
     *
     * @param date 日期 (12小时制)
     * @return 格式化后的日期字符串
     */
    public static String formatDateTimeH3(Date date) {
        return format(date, DATE_TIME_h_PATTERN3);
    }
 
    /**
     * Date转 格式：DATE_TIME_h_PATTERN4 = "yyyy.MM.dd hh:mm:ss";
     *
     * @param date 日期 (12小时制)
     * @return 格式化后的日期字符串
     */
    public static String formatDateTimeH4(Date date) {
        return format(date, DATE_TIME_h_PATTERN4);
    }
 
    /**
     * Date转 格式：DATE_TIME_h_PATTERN5 = "yyyy年MM月dd日 hh:mm:ss";
     *
     * @param date 日期 (12小时制)
     * @return 格式化后的日期字符串
     */
    public static String formatDateTimeH5(Date date) {
        return format(date, DATE_TIME_h_PATTERN5);
    }
 
    /**
     * Date转 格式：DATE_TIME_h_PATTERN6 = "yyyy年MM月dd日 hh时mm分ss秒";
     *
     * @param date 日期 (12小时制)
     * @return 格式化后的日期字符串
     */
    public static String formatDateTimeH6(Date date) {
        return format(date, DATE_TIME_h_PATTERN6);
    }
 
    /**
     * Date转 格式：DATE_TIME_h_PATTERN7 = "yyyy年MM月dd日 hh小时mm分钟ss秒";
     *
     * @param date 日期 (12小时制)
     * @return 格式化后的日期字符串
     */
    public static String formatDateTimeH7(Date date) {
        return format(date, DATE_TIME_h_PATTERN7);
    }
 
    /**
     * Date转 格式：DATE_TIME_h_PATTERN8 = "yyyy年MM月dd日hh小时mm分钟ss秒";
     *
     * @param date 日期 (12小时制)
     * @return 格式化后的日期字符串
     */
    public static String formatDateTimeH8(Date date) {
        return format(date, DATE_TIME_h_PATTERN8);
    }
 
    /**
     * Date转 格式：DATE_TIME_SSS_PATTERN = "yyyy-MM-dd HH:mm:ss.SSS";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateTimeSSS(Date date) {
        return format(date, DATE_TIME_SSS_PATTERN);
    }
 
    /**
     * Date转 格式：DATE_TIME_SSS_PATTERN2 = "yyyyMMddHHmmssSSS";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateTimeSSS2(Date date) {
        return format(date, DATE_TIME_SSS_PATTERN2);
    }
 
    /**
     * Date转 格式：DATE_TIME_SSS_PATTERN3 = "yyyy/MM/dd HH:mm:ss.SSS";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateTimeSSS3(Date date) {
        return format(date, DATE_TIME_SSS_PATTERN3);
    }
 
    /**
     * Date转 格式：DATE_TIME_SSS_PATTERN4 = "yyyy.MM.dd HH:mm:ss.SSS";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateTimeSSS4(Date date) {
        return format(date, DATE_TIME_SSS_PATTERN4);
    }
 
    /**
     * Date转 格式：DATE_TIME_SSS_PATTERN5 = "yyyy年MM月dd日 HH:mm:ss.SSS";
     *
     * @param date 日期
     * @return 格式化后的日期字符串
     */
    public static String formatDateTimeSSS5(Date date) {
        return format(date, DATE_TIME_SSS_PATTERN5);
    }
 
    /**
     * Date转 格式：DATE_TIME_h_SSS_PATTERN = "yyyy-MM-dd hh:mm:ss.SSS";
     *
     * @param date 日期 (12小时制)
     * @return 格式化后的日期字符串
     */
    public static String formatDateTimeHSSS(Date date) {
        return format(date, DATE_TIME_h_SSS_PATTERN);
    }
 
    /**
     * Date转 格式：DATE_TIME_h_SSS_PATTERN2 = "yyyyMMddhhmmssSSS";
     *
     * @param date 日期 (12小时制)
     * @return 格式化后的日期字符串
     */
    public static String formatDateTimeHSSS2(Date date) {
        return format(date, DATE_TIME_h_SSS_PATTERN2);
    }
 
    /**
     * Date转 格式：DATE_TIME_h_SSS_PATTERN3 = "yyyy/MM/dd hh:mm:ss.SSS";
     *
     * @param date 日期 (12小时制)
     * @return 格式化后的日期字符串
     */
    public static String formatDateTimeHSSS3(Date date) {
        return format(date, DATE_TIME_h_SSS_PATTERN3);
    }
 
    /**
     * Date转 格式：DATE_TIME_h_SSS_PATTERN4 = "yyyy.MM.dd hh:mm:ss.SSS";
     *
     * @param date 日期 (12小时制)
     * @return 格式化后的日期字符串
     */
    public static String formatDateTimeHSSS4(Date date) {
        return format(date, DATE_TIME_h_SSS_PATTERN4);
    }
 
    /**
     * Date转 格式：DATE_TIME_h_SSS_PATTERN5 = "yyyy年MM月dd日 hh:mm:ss.SSS";
     *
     * @param date 日期 (12小时制)
     * @return 格式化后的日期字符串
     */
    public static String formatDateTimeHSSS5(Date date) {
        return format(date, DATE_TIME_h_SSS_PATTERN5);
    }
 
 
    /**
     * Date转字符串公共格式化方法
     *
     * @param date    日期
     * @param pattern 格式，格式化默认为yyyy-MM-dd
     * @return 格式化后的日期字符串
     */
    public static String format(Date date, String pattern) {
        try {
            if (date != null) {
                if (StringUtils.isBlank(pattern)) {
                    pattern = DATE_PATTERN;
                }
                SimpleDateFormat df = new SimpleDateFormat(pattern);
                return df.format(date);
            }
        } catch (Exception e) {
            return null;
        }
        return null;
    }
 
    // ===========================****************Date获取时间戳方法****************===========================
 
    /**
     * 获取当前时间的时间戳
     *
     * @return 当前时间的时间戳
     */
    public static long getNowTimestamp() {
        Date now = new Date();
        return getDateTimestamp(now);
    }
 
    /**
     * 获取指定时间的时间戳
     *
     * @param date 指定时间
     * @return 时间戳
     */
    public static long getDateTimestamp(Date date) {
        if (date == null) {
            return 0;
        }
        return date.getTime();
    }
 
    // ===========================****************String类型日期获取时间戳方法****************===========================
 
    /**
     * 获取指定时间的时间戳
     *
     * @param date 指定时间
     *             格式为 yyyy-MM-dd
     * @return 时间戳
     */
    public static long getDateTimestampByYYYYMMDD(String date) {
        if (StringUtils.isBlank(date)) {
            return 0;
        }
        return getDateTimestamp(parseDate(date));
    }
 
    /**
     * 获取指定时间的时间戳
     *
     * @param date 指定时间
     *             格式为 yyyy-MM-dd
     * @return 时间戳
     */
    public static long getDateTimestampByYYYYMMDDHHMMSS(String date) {
        if (StringUtils.isBlank(date)) {
            return 0;
        }
        return getDateTimestamp(parseDate(date, DATE_TIME_PATTERN));
    }

    /**
     * 获取日期时间对象
     *
     * @param date 日期
     * @return 日期时间对象
     */
    public static DateTime getDateTime(Date date) {
        if (date == null) {
            return null;
        }
        return new DateTime(date);
    }
 
    // =============******Date日期比较方法*********==============
 
    /**
     * 比较两个时间是否相等，只比较年
     *
     * @param date1 时间1
     * @param date2 时间2
     * @return 是否相等
     */
    public static boolean compareEqualDateYYYY(Date date1, Date date2) {
        if (date1 == null || date2 == null) {
            return false;
        }
        Calendar cal1 = Calendar.getInstance();
        Calendar cal2 = Calendar.getInstance();
        cal1.setTime(date1);
        cal2.setTime(date2);
        // 清除时、分、秒和毫秒
        cal1.set(Calendar.HOUR_OF_DAY, 0);
        cal1.set(Calendar.MINUTE, 0);
        cal1.set(Calendar.SECOND, 0);
        cal1.set(Calendar.MILLISECOND, 0);
 
        cal2.set(Calendar.HOUR_OF_DAY, 0);
        cal2.set(Calendar.MINUTE, 0);
        cal2.set(Calendar.SECOND, 0);
        cal2.set(Calendar.MILLISECOND, 0);
        // 现在只比较年
        return cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR);
    }
 
    /**
     * 比较两个时间是否相等，只比较年
     * (Java8+)
     *
     * @param date1 时间1
     * @param date2 时间2
     * @return 是否相等
     */
    public static boolean compareEqualDateYYYYJava8(Date date1, Date date2) {
        if (date1 == null || date2 == null) {
            return false;
        }
        LocalDate ld1 = ZonedDateTime.ofInstant(date1.toInstant(), ZoneId.systemDefault()).toLocalDate();
        LocalDate ld2 = ZonedDateTime.ofInstant(date2.toInstant(), ZoneId.systemDefault()).toLocalDate();
 
        // 现在只比较年
        return ld1.getYear() == ld2.getYear();
    }
 
    /**
     * 比较两个时间是否相等，只比较年月
     *
     * @param date1 时间1
     * @param date2 时间2
     * @return 是否相等
     */
    public static boolean compareEqualDateYYYYMM(Date date1, Date date2) {
        if (date1 == null || date2 == null) {
            return false;
        }
        Calendar cal1 = Calendar.getInstance();
        Calendar cal2 = Calendar.getInstance();
        cal1.setTime(date1);
        cal2.setTime(date2);
        // 清除时、分、秒和毫秒
        cal1.set(Calendar.HOUR_OF_DAY, 0);
        cal1.set(Calendar.MINUTE, 0);
        cal1.set(Calendar.SECOND, 0);
        cal1.set(Calendar.MILLISECOND, 0);
 
        cal2.set(Calendar.HOUR_OF_DAY, 0);
        cal2.set(Calendar.MINUTE, 0);
        cal2.set(Calendar.SECOND, 0);
        cal2.set(Calendar.MILLISECOND, 0);
        // 现在只比较年和月
        return cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) &&
                cal1.get(Calendar.MONTH) == cal2.get(Calendar.MONTH);
    }
 
    /**
     * 比较两个时间是否相等，只比较年月
     * (Java8+)
     *
     * @param date1 时间1
     * @param date2 时间2
     * @return 是否相等
     */
    public static boolean compareEqualDateYYYYMMJava8(Date date1, Date date2) {
        if (date1 == null || date2 == null) {
            return false;
        }
        LocalDate ld1 = ZonedDateTime.ofInstant(date1.toInstant(), ZoneId.systemDefault()).toLocalDate();
        LocalDate ld2 = ZonedDateTime.ofInstant(date2.toInstant(), ZoneId.systemDefault()).toLocalDate();
 
        // 现在只比较年和月
        return ld1.getYear() == ld2.getYear() &&
                ld1.getMonthValue() == ld2.getMonthValue();
    }
 
    /**
     * 比较两个时间是否相等，只比较年月日
     *
     * @param date1 时间1
     * @param date2 时间2
     * @return 是否相等
     */
    public static boolean compareEqualDateYYYYMMDD(Date date1, Date date2) {
        if (date1 == null || date2 == null) {
            return false;
        }
        Calendar cal1 = Calendar.getInstance();
        Calendar cal2 = Calendar.getInstance();
        cal1.setTime(date1);
        cal2.setTime(date2);
        // 清除时、分、秒和毫秒
        cal1.set(Calendar.HOUR_OF_DAY, 0);
        cal1.set(Calendar.MINUTE, 0);
        cal1.set(Calendar.SECOND, 0);
        cal1.set(Calendar.MILLISECOND, 0);
 
        cal2.set(Calendar.HOUR_OF_DAY, 0);
        cal2.set(Calendar.MINUTE, 0);
        cal2.set(Calendar.SECOND, 0);
        cal2.set(Calendar.MILLISECOND, 0);
        // 现在只比较年和月和日
        return cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) &&
                cal1.get(Calendar.MONTH) == cal2.get(Calendar.MONTH) &&
                cal1.get(Calendar.DAY_OF_MONTH) == cal2.get(Calendar.DAY_OF_MONTH);
    }
 
    /**
     * 比较两个时间是否相等，只比较年月日
     * (Java8+)
     *
     * @param date1 时间1
     * @param date2 时间2
     * @return 是否相等
     */
    public static boolean compareEqualDateYYYYMMDDJava8(Date date1, Date date2) {
        if (date1 == null || date2 == null) {
            return false;
        }
        LocalDate ld1 = ZonedDateTime.ofInstant(date1.toInstant(), ZoneId.systemDefault()).toLocalDate();
        LocalDate ld2 = ZonedDateTime.ofInstant(date2.toInstant(), ZoneId.systemDefault()).toLocalDate();
 
        // 现在只比较年和月和日
        return ld1.getYear() == ld2.getYear() &&
                ld1.getMonthValue() == ld2.getMonthValue() &&
                ld1.getDayOfMonth() == ld2.getDayOfMonth();
    }
 
    /**
     * 比较两个时间是否相等，只比较年月日时分秒
     *
     * @param date1 时间1
     * @param date2 时间2
     * @return 是否相等
     */
    public static boolean compareEqualDateYYYYMMDDHHMMSS(Date date1, Date date2) {
        if (date1 == null || date2 == null) {
            return false;
        }
        Calendar cal1 = Calendar.getInstance();
        Calendar cal2 = Calendar.getInstance();
        cal1.setTime(date1);
        cal2.setTime(date2);
        // 清除毫秒
        cal1.set(Calendar.MILLISECOND, 0);
        cal2.set(Calendar.MILLISECOND, 0);
        // 现在只比较年和月和日、时分秒
        return cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) &&
                cal1.get(Calendar.MONTH) == cal2.get(Calendar.MONTH) &&
                cal1.get(Calendar.DAY_OF_MONTH) == cal2.get(Calendar.DAY_OF_MONTH) &&
                cal1.get(Calendar.HOUR_OF_DAY) == cal2.get(Calendar.HOUR_OF_DAY) &&
                cal1.get(Calendar.MINUTE) == cal2.get(Calendar.MINUTE) &&
                cal1.get(Calendar.SECOND) == cal2.get(Calendar.SECOND);
    }
 
    /**
     * 比较两个时间是否相等，只比较年月日时分秒
     * (Java8+)
     *
     * @param date1 时间1
     * @param date2 时间2
     * @return 是否相等
     */
    public static boolean compareEqualDateYYYYMMDDHHMMSSJava8(Date date1, Date date2) {
        if (date1 == null || date2 == null) {
            return false;
        }
        LocalDateTime ld1 = ZonedDateTime.ofInstant(date1.toInstant(), ZoneId.systemDefault()).toLocalDateTime();
        LocalDateTime ld2 = ZonedDateTime.ofInstant(date2.toInstant(), ZoneId.systemDefault()).toLocalDateTime();
 
        // 现在只比较年和月和日、时分秒
        return ld1.getYear() == ld2.getYear() &&
                ld1.getMonthValue() == ld2.getMonthValue() &&
                ld1.getDayOfMonth() == ld2.getDayOfMonth() &&
                ld1.getHour() == ld2.getHour() &&
                ld1.getMinute() == ld2.getMinute() &&
                ld1.getSecond() == ld2.getSecond();
    }
 
    /**
     * 比较两个时间大小，只比较年
     * 注意：时间参数不可为空
     *
     * @param date1 时间1
     * @param date2 时间2
     * @return >0 : 时间1 大于(>) 时间2
     * <0 : 时间1 小于(<) 时间2
     * =0 : 时间1 等于(=) 时间2
     */
    public static int compareDateYYYY(Date date1, Date date2) {
        Calendar cal1 = Calendar.getInstance();
        Calendar cal2 = Calendar.getInstance();
 
        cal1.setTime(date1);
        cal2.setTime(date2);
 
        // 提取年份和月份
        int year1 = cal1.get(Calendar.YEAR);
        int year2 = cal2.get(Calendar.YEAR);
 
        // 首先比较年份，如果年份不同，则直接返回结果
        if (year1 != year2) {
            return Integer.compare(year1, year2);
        }
        return 0;
    }
 
    /**
     * 比较两个时间大小，只比较年
     * 注意：时间参数不可为空
     *
     * @param date1 时间1
     * @param date2 时间2
     * @return >0 : 时间1 大于(>) 时间2
     * <0 : 时间1 小于(<) 时间2
     * =0 : 时间1 等于(=) 时间2
     */
    public static int compareDateYYYYJava8(Date date1, Date date2) {
        LocalDate ld1 = ZonedDateTime.ofInstant(date1.toInstant(), ZoneId.systemDefault()).toLocalDate();
        LocalDate ld2 = ZonedDateTime.ofInstant(date2.toInstant(), ZoneId.systemDefault()).toLocalDate();
        return Integer.compare(ld1.getYear(), ld2.getYear());
    }
 
    /**
     * 比较两个时间大小，只比较年月
     * 注意：时间参数不可为空
     *
     * @param date1 时间1
     * @param date2 时间2
     * @return >0 : 时间1 大于(>) 时间2
     * <0 : 时间1 小于(<) 时间2
     * =0 : 时间1 等于(=) 时间2
     */
    public static int compareDateYYYYMM(Date date1, Date date2) {
        Calendar cal1 = Calendar.getInstance();
        Calendar cal2 = Calendar.getInstance();
 
        cal1.setTime(date1);
        cal2.setTime(date2);
 
        // 提取年份和月份
        int year1 = cal1.get(Calendar.YEAR);
        int month1 = cal1.get(Calendar.MONTH); // 注意：Calendar中的月份是从0开始的
        int year2 = cal2.get(Calendar.YEAR);
        int month2 = cal2.get(Calendar.MONTH);
 
        // 首先比较年份，如果年份不同，则直接返回结果
        if (year1 != year2) {
            return Integer.compare(year1, year2);
        }
        // 如果年份相同，则比较月份
        return Integer.compare(month1, month2);
    }
 
    /**
     * 比较两个时间大小，只比较年月
     * 注意：时间参数不可为空
     *
     * @param date1 时间1
     * @param date2 时间2
     * @return >0 : 时间1 大于(>) 时间2
     * <0 : 时间1 小于(<) 时间2
     * =0 : 时间1 等于(=) 时间2
     */
    public static int compareDateYYYYMMJava8(Date date1, Date date2) {
        LocalDate ld1 = ZonedDateTime.ofInstant(date1.toInstant(), ZoneId.systemDefault()).toLocalDate();
        LocalDate ld2 = ZonedDateTime.ofInstant(date2.toInstant(), ZoneId.systemDefault()).toLocalDate();
        // 如果年份相同，则比较月份
        return Integer.compare(ld1.getYear() * 100 + ld1.getMonthValue(),
                ld2.getYear() * 100 + ld2.getMonthValue());
    }
 
    /**
     * 比较两个时间大小，只比较年月日
     * 注意：时间参数不可为空
     *
     * @param date1 时间1
     * @param date2 时间2
     * @return >0 : 时间1 大于(>) 时间2
     * <0 : 时间1 小于(<) 时间2
     * =0 : 时间1 等于(=) 时间2
     */
    public static int compareDateYYYYMMDD(Date date1, Date date2) {
        Calendar cal1 = Calendar.getInstance();
        Calendar cal2 = Calendar.getInstance();
 
        cal1.setTime(date1);
        cal2.setTime(date2);
 
        // 提取年份和月份
        int year1 = cal1.get(Calendar.YEAR);
        int month1 = cal1.get(Calendar.MONTH); // 注意：Calendar中的月份是从0开始的
        int day1 = cal1.get(Calendar.DAY_OF_MONTH);
        int year2 = cal2.get(Calendar.YEAR);
        int month2 = cal2.get(Calendar.MONTH);
        int day2 = cal2.get(Calendar.DAY_OF_MONTH);
 
        // 首先比较年份，如果年份不同，则直接返回结果
        if (year1 != year2) {
            return Integer.compare(year1, year2);
        }
        if (month1 != month2) {
            // 如果年份相同，则比较月份
            return Integer.compare(month1, month2);
        }
        // 如果月份相同，则比较日期
        return Integer.compare(day1, day2);
    }
 
    /**
     * 比较两个时间大小，只比较年月日
     * 注意：时间参数不可为空
     *
     * @param date1 时间1
     * @param date2 时间2
     * @return >0 : 时间1 大于(>) 时间2
     * <0 : 时间1 小于(<) 时间2
     * =0 : 时间1 等于(=) 时间2
     */
    public static int compareDateYYYYMMDDJava8(Date date1, Date date2) {
        LocalDate ld1 = ZonedDateTime.ofInstant(date1.toInstant(), ZoneId.systemDefault()).toLocalDate();
        LocalDate ld2 = ZonedDateTime.ofInstant(date2.toInstant(), ZoneId.systemDefault()).toLocalDate();
        // 使用LocalDate的compareTo方法来比较年月日
        return ld1.compareTo(ld2);
    }
 
    /**
     * 比较两个时间大小，只比较年月日时分秒
     * 注意：时间参数不可为空
     *
     * @param date1 时间1
     * @param date2 时间2
     * @return >0 : 时间1 大于(>) 时间2
     * <0 : 时间1 小于(<) 时间2
     * =0 : 时间1 等于(=) 时间2
     */
    public static int compareDateYYYYMMDDHHMMSS(Date date1, Date date2) {
        Calendar cal1 = Calendar.getInstance();
        Calendar cal2 = Calendar.getInstance();
 
        cal1.setTime(date1);
        cal2.setTime(date2);
 
        // 清除毫秒部分（如果需要的话，实际上Calendar的比较默认就会忽略毫秒）
        // 但为了明确表明我们的意图，我们可以将毫秒设置为0
        cal1.set(Calendar.MILLISECOND, 0);
        cal2.set(Calendar.MILLISECOND, 0);
 
        // 比较两个Calendar对象
        if (cal1.equals(cal2)) {
            return 0;
        } else if (cal1.before(cal2)) {
            return -1;
        } else {
            return 1;
        }
    }
 
    /**
     * 比较两个时间大小，只比较年月日时分秒
     * 注意：时间参数不可为空
     *
     * @param date1 时间1
     * @param date2 时间2
     * @return >0 : 时间1 大于(>) 时间2
     * <0 : 时间1 小于(<) 时间2
     * =0 : 时间1 等于(=) 时间2
     */
    public static int compareDateYYYYMMDDHHMMSSJava8(Date date1, Date date2) {
        LocalDateTime ld1 = ZonedDateTime.ofInstant(date1.toInstant(), ZoneId.systemDefault()).toLocalDateTime();
        LocalDateTime ld2 = ZonedDateTime.ofInstant(date2.toInstant(), ZoneId.systemDefault()).toLocalDateTime();
        // 使用LocalDate的compareTo方法来比较年月日
        return ld1.compareTo(ld2);
    }
 
    /**
     * 检查两个时间之间的差异是否大于等于30分钟
     *
     * @param date1 第一个时间
     * @param date2 第二个时间
     * @return 如果时间差大于等于30分钟，则返回true；否则返回false
     */
    public static boolean isTimeDifferenceMoreThanOrEqual30Minutes(Date date1, Date date2) {
        long diffInMillis = Math.abs(date2.getTime() - date1.getTime()); // 计算时间差（毫秒）
        long diffInMinutes = diffInMillis / (1000 * 60); // 将毫秒转换为分钟
        return diffInMinutes >= 30;
    }
 
    /**
     * 检查两个时间之间的差异是否大于等于多少分钟
     *
     * @param date1 第一个时间
     * @param date2 第二个时间
     * @param num 多少分钟，自定义
     * @return 如果时间差大于等于30分钟，则返回true；否则返回false
     */
    public static boolean isTimeDifferenceMoreThanOrEqual30Minutes(Date date1, Date date2, Integer num) {
        long diffInMillis = Math.abs(date2.getTime() - date1.getTime()); // 计算时间差（毫秒）
        long diffInMinutes = diffInMillis / (1000 * 60); // 将毫秒转换为分钟
        return diffInMinutes >= 30;
    }
 
    // =============******Date日期获取方法*********==============
 
    /**
     * 根据年份获取所有月份
     * @param year 年份
     * @return 所有月份
     */
    public static List<String> traverseMonthsOfYear(Integer year){
        if(year == null){
            return Lists.newArrayList();
        }
        // 遍历年份和月份
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, Calendar.JANUARY, 1); // 设置为2024年1月1日
        List<String> months = Lists.newArrayList();
        while (calendar.get(Calendar.YEAR) == year) { // 假设只处理2024年的数据
            int month = calendar.get(Calendar.MONTH) + 1; // 月份是从0开始的，所以要加1
            months.add(String.valueOf(month));
            // 移动到下一个月
            calendar.add(Calendar.MONTH, 1);
        }
        return months;
    }
 
    /**
     * 根据年份+月份获取月份的所有周
     * @param year 年份
     * @param month 月份
     * @return 所有周
     */
    public static List<String> traverseWeeksOfMonth(Integer year, Integer month) {
        if(year == null || month == null){
            return Lists.newArrayList();
        }
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month - 1, 1); // 设置日期为月份的第一天
        List<String> weeks = Lists.newArrayList();
        // 循环直到我们到达下一个月的第一天
        while (calendar.get(Calendar.MONTH) == month - 1) {
            int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);
            weeks.add(String.valueOf(weekOfYear));
            // 移动到下一天
            calendar.add(Calendar.WEEK_OF_MONTH, 1);
            // 如果我们已经到达了下个月，则退出循环
            if (calendar.get(Calendar.WEEK_OF_MONTH) == 1 && calendar.get(Calendar.MONTH) != month - 1) {
                break;
            }
        }
        return weeks;
    }
 
    /**
     * 根据年份+月份获取月份的所有天
     * @param year 年份
     * @param month 月份
     * @return 所有天 （格式：日）
     */
    public static List<String> traverseDaysOfMonth(Integer year, Integer month) {
        if(year == null || month == null){
            return Lists.newArrayList();
        }
        List<String> days = Lists.newArrayList();
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month - 1, 1); // 注意月份是从0开始的
 
        // 遍历当月的每一天
        while (calendar.get(Calendar.MONTH) == month - 1) {
            int day = calendar.get(Calendar.DAY_OF_MONTH);
            days.add(String.valueOf(day));
            // 移动到下一天
            calendar.add(Calendar.DAY_OF_MONTH, 1);
        }
        return days;
    }
 
    /**
     * 根据年份+月份获取月份的所有天
     * 跨年跨月
     * @return 所有天  (格式：月-日)
     */
    public static List<String> traverseDaysOfMonth(Integer startYear, Integer startMonth, Integer startDay,
                                                   Integer endYear, Integer endMonth, Integer endDay) {
        if(startYear == null || startMonth == null || startDay == null
                || endYear == null || endMonth == null || endDay == null){
            return Lists.newArrayList();
        }
        List<String> days = Lists.newArrayList();
        Calendar startDate = Calendar.getInstance();
        startDate.set(startYear, startMonth - 1, startDay); // 注意月份是从0开始的，所以12月是Calendar.DECEMBER
        Calendar endDate = Calendar.getInstance();
        endDate.set(endYear, endMonth - 1, endDay);
 
        // 循环遍历并打印每一天
        while (!startDate.after(endDate)) {
            // 打印日期，使用SimpleDateFormat来格式化日期输出
            // 这里简单使用toString()展示，实际使用中可以根据需要格式化
            int year = startDate.get(Calendar.YEAR);
            int month = startDate.get(Calendar.MONTH);
            int day = startDate.get(Calendar.DAY_OF_MONTH);
            days.add(((month + 1) < 10 ? "0" + (month + 1) : (month + 1))
                    + "-"
                    + (day < 10 ? "0" + day : day));
            // 将startDate向前推进一天
            startDate.add(Calendar.DAY_OF_MONTH, 1);
        }
 
        return days;
    }
 
    /**
     * 根据年份+月份获取指定天的所有小时
     * @param year 年份
     * @param month 月份
     * @return 所有小时
     */
    public static List<String> traverseHoursOfDay(Integer year, Integer month, Integer day){
        if(year == null || month == null || day == null){
            return Lists.newArrayList();
        }
        List<String> hours = Lists.newArrayList();
        // 设置Calendar实例为某一天（例如，2023年1月1日）
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month - 1, day); // 注意月份是从0开始的
        // 获取当前时间
        Calendar curCalendar = Calendar.getInstance();
        // 获取当前时间的日期
        int curDayOfMonth = curCalendar.get(Calendar.DAY_OF_MONTH);
        // 获取当前时间的小时（24小时制）
        int curHour = curCalendar.get(Calendar.HOUR_OF_DAY);
        // 遍历当天的每一个小时
        for (int hour = 0; hour < 24; hour++) {
            // 设置小时
            calendar.set(Calendar.HOUR_OF_DAY, hour);
 
            // 获取并打印当前时间（这里只打印日期和小时，分钟和秒设为0）
            // 注意：如果你想要包含分钟和秒，可以保持它们为当前值或显式设置为0
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);
            calendar.set(Calendar.MILLISECOND, 0);
 
            int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
            int hourOfDay = calendar.get(Calendar.HOUR_OF_DAY);
            hours.add((hourOfDay < 10 ? "0" + hourOfDay : String.valueOf(hourOfDay)) + ":00");
            if(dayOfMonth == curDayOfMonth && hourOfDay == curHour){
                break;
            }
        }
        return hours;
    }
 
}